package com.li.java2;

import com.sun.xml.internal.bind.v2.model.core.ID;
import org.junit.Test;

import java.util.Arrays;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 一、构造器引用
 *  和方法引用类型，函数式接口的抽象方法的形参列表和构造器的形参列表一致
 *  抽象方法的返回值类型是构造器所属的类的类型
 *
 * 二、数组引用
 *
 *
 * Created by shkstart
 */
public class ConstructorRefTest {
	//构造器引用
    //Supplier中的T get()
    @Test
    public void test1(){
        //供给型
        Supplier<Employee>  sup = new Supplier<Employee>() {
            @Override
            public Employee get() {
                return new Employee();
            }
        };

        Supplier<Employee>  sup1= () -> new Employee();
        System.out.println(sup1.get());

        //构造器引用
        Supplier<Employee>  sup2=Employee::new;
        System.out.println(sup2.get());

    }

	//Function中的R apply(T t)
    @Test
    public void test2(){

        Function<Integer,Employee> func1 =id -> new Employee(id);
        Employee apply = func1.apply(1001);
        System.out.println(apply);

        Function<Integer,Employee> func2 = Employee::new;
        Employee apply1 = func2.apply(1002);
        System.out.println(apply1);
    }

	//BiFunction中的R apply(T t,U u)
    @Test
    public void test3(){
    BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);
        System.out.println(func1.apply(1001, "ttt"));

        BiFunction<Integer,String,Employee> func2 =Employee::new;
        System.out.println(func2.apply(111, "sfs"));
    }

	//数组引用
    //Function中的R apply(T t)
    @Test
    public void test4(){
        Function<Integer,String[]> func1 = (length) -> new String[length];
        System.out.println(Arrays.toString(func1.apply(5)));

        Function<Integer,String[]> func2= String[]::new;
        String[] apply = func2.apply(13);
        System.out.println(Arrays.toString(apply));

    }
}
